;
(function($) {
	$.fn.TableGrid = function(options_or_method, index) {
		if (!$(this).length) {
			return this;
		}
		if ($.isPlainObject(options_or_method)) {
			// 如果是个初始化
			return this.each(function() {
						var id = $(this).attr('id');
						init(id, options_or_method);
					});
		} else {
			// 如果是一个方法
			var id = $(this).attr('id');
			return do_method(id, options_or_method, index);
		}
	}
	$.fn.TableGrid.data = [];
	function init(id, options) {
		var _this = this;
		// 默认设置
		var default_settings = {
			id : '',
			url : '',
			rows : {},
			sort : '',
			order : '',
			page : 1,
			total : 1,
			status : false,
			pagination : true,
			page_size_range : [10,20,50,100],
			total_page : 1,
			page_size : 10,
			param : {},
			select_all : false,
			row_style : function() {},
			load_handel : null,
			after_load : function() {},
			load_after_init : true
			,
		}
		$.fn.TableGrid.data[id] = $.extend(default_settings, options);
		init_sort_btn(id);
		init_select_all(id);
		init_pagination(id);
		if ($.fn.TableGrid.data[id].load_after_init) {
			load_table_data(id);
		}
	}
	// 方法
	function do_method(id, method, index) {
		switch (method) {
			case 'getrows' :
				return $.fn.TableGrid.data[id].rows;
			case 'getrow' :
				return $.fn.TableGrid.data[id].rows[index];
			case 'getparam' :
				return $.fn.TableGrid.data[id].param;
			case 'param' :
				if (typeof(index['page']) != 'undefined') {
					$.fn.TableGrid.data[id].page = index['page'];
				}
				return $.fn.TableGrid.data[id].param = index;
			case 'setpage' :
				return $.fn.TableGrid.data[id].page = index;
			case 'reload' :
				load_table_data(id);
				break;
		}
	}
	// 加载表内容
	function load_table_data(id) {
		var opt = $.fn.TableGrid.data[id];
		opt.param['page'] = opt.page;
		var post_data = {
			page : opt.page,
			page_size : opt.page_size,
			sort : opt.sort,
			order : opt.order
			,
		};
		$.extend(post_data, $.fn.TableGrid.data[id].param);
		if ($.fn.TableGrid.data[id].load_handel) {
			$.fn.TableGrid.data[id].load_handel.abort();
			$.fn.TableGrid.data[id].load_handel = null;
		}
		$.fn.TableGrid.data[id].load_handel = $.post($.fn.TableGrid.data[id].url, post_data, function(ret) {
					$.fn.TableGrid.data[id].load_handel = null;
					$.fn.TableGrid.data[id].status = true;
					$.fn.TableGrid.data[id].rows = ret.rows;
					$.fn.TableGrid.data[id].total = ret.total;
					var data = $.fn.TableGrid.data[id];
					var tableobj = $("#" + id);
					if (tableobj.find('tbody').length == 0) {
						tableobj.find('thead').after('<tbody></tbody>');
					} else {
						tableobj.find('tbody').empty();
					}
					var html = '';
					var fun = new Array();
					if (!data.rows || data.rows.length == 0) {
						var col = tableobj.find('thead th').length;
						html += '<tr><td colspan="' + col + '" class="warning" style="text-align:center">暂无记录 <td></tr>';
					} else {
						// 关于统计
						var total = {};
						var with_footer_count = tableobj.find('tfoot').length > 0 ? true : false;
						if (with_footer_count) {
							tableobj.find('tfoot td[data-sum]').each(function() {
										var field = $(this).data('sum');
										total[field] = 0;
									});
						}
						// 表内容
						$.each(data.rows, function(index, row) {
									var c = $.fn.TableGrid.data[id].row_style(row, index);
									c = typeof(c) != 'undefinded' ? 'class="' + c + '"' : '';
									html += '<tr ' + c + ' >' + make_table_html(id, index, row, fun) + '</tr>';
									$.each(total, function(index) {
												total[index] += Number(row[index]);
											});
								});
						// 统计
						if (with_footer_count) {
							$.each(total, function(index, value) {
										tableobj.find('tfoot td[data-sum="' + index + '"]').html(value);
									});
						}
					}
					tableobj.find('tbody').append(html);
					for (var i = 0; i < fun.length; i++) {
						fun[i]();
					}
					$.fn.TableGrid.data[id].after_load(post_data.page, post_data.page_size, opt.total, data.rows);
					// 翻页
					if ($.fn.TableGrid.data[id].pagination) {
						var total = $.fn.TableGrid.data[id].total;
						var page = $.fn.TableGrid.data[id].page;
						var page_size = $.fn.TableGrid.data[id].page_size;
						var total_page = Math.ceil(total / page_size);
						var pageobj = tableobj.next();
						pageobj.find('.inp-cur-page').val(page);
						pageobj.find('.spn-total-page').html(total_page);
						pageobj.find('.total-rows').html(total);
						if (page == 1) {
							if (!pageobj.find('.btn-first-page').hasClass('disabled')) {
								pageobj.find('.btn-first-page').addClass('disabled')
							}
							if (!pageobj.find('.btn-last-pagee').hasClass('disabled')) {
								pageobj.find('.btn-last-page').addClass('disabled')
							}
						} else {
							if (pageobj.find('.btn-first-page').hasClass('disabled')) {
								pageobj.find('.btn-first-page').removeClass('disabled')
							}
							if (pageobj.find('.btn-last-page').hasClass('disabled')) {
								pageobj.find('.btn-last-page').removeClass('disabled')
							}
						}
						if (page == total_page || total_page == 0) {
							if (!pageobj.find('.btn-next-page').hasClass('disabled')) {
								pageobj.find('.btn-next-page').addClass('disabled')
							}
							if (!pageobj.find('.btn-end-page').hasClass('disabled')) {
								pageobj.find('.btn-end-page').addClass('disabled')
							}
						} else {
							if (pageobj.find('.btn-next-page').hasClass('disabled')) {
								pageobj.find('.btn-next-page').removeClass('disabled')
							}
							if (pageobj.find('.btn-end-page').hasClass('disabled')) {
								pageobj.find('.btn-end-page').removeClass('disabled')
							}
						}
					}
				});
	}
	// 制作 表数据
	function make_table_html(id, index, row, fun) {
		var tableobj = $("#" + id);
		var html = '';
		tableobj.find('thead th').each(function() {
					var align = $(this).data('align') ? 'align="' + $(this).data('align') + '"' : '';
					var valign = $(this).data('valign') ? 'valign="' + $(this).data('valign') + '"' : '';
					if ($(this).data('select-all')) {
						var value = '<input type="checkbox" class="tablegrid-select" name="tablegrid-select[]" value="1">';
					} else {
						var field = $(this).data('field') ? $(this).data('field') : '';
						var value = field != null && field != '' ? row[field] : '';
						value = value == null ? '' : value;
					}
					if ($(this).data('formatter')) {
						rowformater = eval($(this).data('formatter'));
						var f = {};
						value = rowformater(value, row, index, f);
						if (f.fun) {
							fun.push(f.fun);
						}
					}
					if ($(this).data('suffix')) {
						value = value + $(this).data('suffix');
					}
					html += '<td ' + align + ' ' + valign + '>' + value + '</td>';
				});
		return html;
	}
	// 初始化排序按钮
	function init_sort_btn(id) {
		var tableobj = $("#" + id);
		// 初始化 排序图标
		tableobj.find('thead th').each(function() {
			var text = $(this).html();
			if ($(this).data('sortable')) {
				var field = $(this).data('field') ? $(this).data('field') : '';
				text = '<a class="tablegrid-sort-btn" data-field="' + field + '" data-order="" href="#">' + text
						+ ' <i class="fa fa-sort"></i></a>';
				$(this).html(text);
			}
		});
		// 初始化排序点击事件
		tableobj.on('click', '.tablegrid-sort-btn', function(event) {
					event.preventDefault();
					var _this = $(this);
					$.fn.TableGrid.data[id].sort = $(this).parent().data('field');
					$.fn.TableGrid.data[id].order = 'asc';
					var _this_order = $(this).data('order');
					tableobj.find('thead th').find('i').removeClass('fa-sort-asc').removeClass('fa-sort-desc').addClass('fa-sort');
					if (_this_order == '' || _this_order == 'desc') {
						$(this).data('order', 'asc');
						$.fn.TableGrid.data[id].order = 'asc';
						$(this).find('i').removeClass('fa-sort').addClass('fa-sort-asc');
					} else if (_this_sort = 'asc') {
						$(this).data('order', 'desc');
						$.fn.TableGrid.data[id].order = 'desc';
						$(this).find('i').removeClass('fa-sort').addClass('fa-sort-desc');
					}
					load_table_data(id);
				});
	}
	// 初始化多选
	function init_select_all(id) {
		if (!$.fn.TableGrid.data[id].select_all) {
			return;
		}
		var tableobj = $("#" + id);
		tableobj.find('thead tr')
				.prepend('<th width="20" data-select-all="true"><input type="checkbox" class="tablegrid_select_all" value="1" ></th>');
		tableobj.on('change', '.tablegrid_select_all', function(e) {
					e.preventDefault();
					tableobj.find('.tablegrid-select').prop('checked', $(this).prop('checked'));
				});
	}
	// 初始化分页
	function init_pagination(id) {
		if (!$.fn.TableGrid.data[id].pagination) {
			return;
		}
		var tableobj = $("#" + id);
		var html = '<form class="form-inline"><div class="table-footer tablegrid-pagination"> 每页显示 ';
		html += '<select class="form-control input-sm page-size"></select> 条记录 ';
		html += '<a class="btn btn-default btn-sm btn-first-page" href="#"><i class="fa fa-step-backward"></i></a> ';
		html += '<a class="btn btn-default btn-sm btn-last-page" href="#"><i class="fa fa-backward"></i></a> ';
		html += '第 <input type="text" class="form-control input-sm inp-cur-page " value="1"> 页 / 共 <span class="spn-total-page">1</span> 页 ';
		html += '<a class="btn btn-default btn-sm btn-next-page" href="#"><i class="fa fa-forward"></i></a> ';
		html += '<a class="btn btn-default btn-sm btn-end-page" href="#"><i class="fa fa-step-forward"></i></a> ';
		html += ' 共<span class="total-rows">1</span>条记录</div>';
		tableobj.after(html);
		var pageobj = tableobj.next();
		var page_size_range = $.fn.TableGrid.data[id].page_size_range;
		var page_size_html = '';
		for (var i = 0; i < page_size_range.length; i++) {
			page_size_html += '<option value="' + page_size_range[i] + '">' + page_size_range[i] + '</option>';
		}
		pageobj.find('.page-size').append(page_size_html);
		var page_size = $.fn.TableGrid.data[id].page_size;
		pageobj.find('.page-size > option[value="' + page_size + '"]').prop('selected', true);
		// 修改 page_size
		pageobj.find('.page-size').change(function() {
					$.fn.TableGrid.data[id].page = 1;
					$.fn.TableGrid.data[id].page_size = $(this).val();
					load_table_data(id);
				});
		// 第一页
		pageobj.on('click', '.btn-first-page', function(e) {
					e.preventDefault();
					$.fn.TableGrid.data[id].page = 1;
					load_table_data(id);
				});
		// 最后一页
		pageobj.on('click', '.btn-end-page', function(e) {
					e.preventDefault();
					var page_size = $.fn.TableGrid.data[id].page_size;
					var total = $.fn.TableGrid.data[id].total;
					var total_page = Math.ceil(total / page_size);
					$.fn.TableGrid.data[id].page = total_page;
					load_table_data(id);
				});
		// 上一页
		pageobj.on('click', '.btn-last-page', function(e) {
					e.preventDefault();
					$.fn.TableGrid.data[id].page = $.fn.TableGrid.data[id].page - 1;
					load_table_data(id);
				});
		// 下一页
		pageobj.on('click', '.btn-next-page', function(e) {
					e.preventDefault();
					$.fn.TableGrid.data[id].page = Number($.fn.TableGrid.data[id].page) + 1;
					load_table_data(id);
				});
		// 页面跳转
		pageobj.on('keypress', '.inp-cur-page', function(e) {
					// 判断回车
					var key = e.which; // e.which是按键的值
					if (key != 13) {
						return;
					}
					e.preventDefault();
					var total = $.fn.TableGrid.data[id].total;
					var page_size = $.fn.TableGrid.data[id].page_size;
					var total_page = Math.ceil(total / page_size);
					var page = $.fn.TableGrid.data[id].page;
					var cur_page = $(this).val();
					if ($.isNumeric(cur_page) && cur_page >= 1 && cur_page <= total_page && cur_page != page) {
						$.fn.TableGrid.data[id].page = cur_page;
						load_table_data(id);
					}
				});
	}
})(jQuery);